// 给出二叉 搜索 树的根节点，该树的节点值各不相同，请你将其转换为累加树（Greater Sum Tree），使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。

// 提醒一下，二叉搜索树满足下列约束条件：

// 节点的左子树仅包含键 小于 节点键的节点。
// 节点的右子树仅包含键 大于 节点键的节点。
// 左右子树也必须是二叉搜索树。

// 来源：力扣（LeetCode）
// 链接：https://leetcode-cn.com/problems/convert-bst-to-greater-tree
// 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

#include<bits/stdc++.h>
#include<string>
#include<vector>
#include<unordered_set>
#include<unordered_map>
#include<set>
#include<queue>
#include<stack>
using namespace std;

// 看了题解，递归
// 执行用时：
// 56 ms
// , 在所有 C++ 提交中击败了
// 13.80%
// 的用户
// 内存消耗：
// 32.6 MB
// , 在所有 C++ 提交中击败了
// 87.95%
// 的用户


struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode() : val(0), left(nullptr), right(nullptr) {}
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 };

class Solution {
public:
    int pre;//记录前一个值
    TreeNode* convertBST(TreeNode* root) {
        pre = 0;
        dfs(root);
        return root;
    }
    void dfs(TreeNode* root){
        if(root == NULL){
            return;
        }
        dfs(root->right);
        root->val =root->val + pre;
        pre = root->val;
        dfs(root->left);
    }
};